<?php 

/**
 * Classe responsável por buscar mater as inscrições dos candidatos
 */
class Admin_Model_Inscricoes
{
    /**
     * Função que irá buscar todas as inscrições possíveis realizadas no sistema.
     * @todo Esta função deverá ser cache e após as alterações, recomenda-se a limpeza de cache para que 
     *       os servidores possam ver as modificações
     * 
     * @return array $paginator
     */
    public function listarInscricoes($post, $page, $itens=100) 
    {
        try {
            // Buscando todas inscrições cadastradas na base e gerando paginação
            $tblInscr = new Admin_Model_DbTable_Remanejamento_Inscricoes();
            $select = $tblInscr->select();
            $select->from(array('ins' => 'inscricoes'), array("ins.ins_codigo", "ins.ins_cd_matricula", "ins.ins_emp_dr", "ins.ins_reg_escolha", "ins.ins_reg_escolha_sub",
                                                              "ins.ins_op_regional", "ins.ins_cd_disciplina", "ins.ins_op_disciplina", "ins.ins_tempo_servico", "ins.ins_adic_endereco",
                                                              "ins.ins_adic_nec_esp", "ins.ins_adic_zonarural", "ins.ins_st_inscricao", "ins.ins_cd_mot_invalida", "ins.ins_tp_concurso",
                                                              "ins.ins_class_provisoria", "ins.ins_class_definitiva", "ins.ins_pont_provisoria", "ins.ins_pont_definitiva",
                                                              "ins.ins_cd_disciplina_reclass", "ins.ins_st_remocao", "ins.ins_dt_status", "ins.ins_class_geral", "ins.data_inclusao",
                                                              "ins.ano_remanejamento"), 'remanejamento')
                   ->joinLeft(array('emp' => 'empregados'), 'ins.ins_cd_matricula = emp.emp_cd_matricula', array('emp.emp_nome', 'emp.emp_cd_lotacao_1', 'emp.emp_cd_lotacao_2'), 'sigrh')
                   ->joinLeft(array('ua' => 'unidades_administrativas'), 'ins.ins_reg_escolha = ua.tua_dr and ins.ins_reg_escolha_sub = ua.tua_subcodigo', array('ua.tua_dr', 'ua.tua_subcodigo', 'ua.tua_descricao'), 'sigrh')
                   ->joinLeft(array('hab' => 'habilitacoes'), 'ins.ins_cd_disciplina = hab.thb_cd_habilit', array('hab.tbh_nome', 'hab.thb_cd_habilit'), 'sigrh')
                   ->setIntegrityCheck(false)
                   ->order('ins.ins_codigo');
            

            if (!empty($post['matricula']))
                $select->where('ins.ins_cd_matricula = ?', $post['matricula']);

            if (!empty($post['status']))
                $select->where('ins.ins_st_inscricao = ?', $post['status']);

            if (!empty($post['tpConcurso']))
                $select->where('ins.ins_tp_concurso = ?', $post['tpConcurso']);

            if (!empty($post['disciplina']))
                $select->where('ins.ins_cd_disciplina = ?', Zend_Filter::filter_static($post['disciplina'], 'Digits'));

            if (!empty($post['reg_escolha'])) 
                $select->where('ins.ins_reg_escolha = ?', Zend_Filter::filter_static($post['disciplina'], 'Digits'));
            
            if (!empty($post['cordenacaoEnsino'])) {
                $reg = explode('_', $post['cordenacaoEnsino']);
                $select->where('ins.ins_reg_escolha = ?', $reg[0])
                       ->where('ins.ins_reg_escolha_sub = ?', isset($reg[1]) ? $reg[1] : 1);
            }
            
            //-- Paginação da busca do banco de dados 
            $paginator = Zend_Paginator::factory($select); 
            $paginator->setCurrentPageNumber($page); 
            $paginator->setItemCountPerPage($itens); 
            $paginator->setDefaultScrollingStyle('Sliding'); 
            $paginator->clearPageItemCache(); 
            Zend_View_Helper_PaginationControl::setDefaultViewPartial('_pagination.phtml'); 

            return $paginator; 
            
        } catch (Exception $exc) {
            echo $exc->getTraceAsString();
            die();
        }
    }
    
    
    /**
     * Esta função irá invalidar uma determinada inscrição.
     * -- A unica validação é feita sobre o 
     */
    public function invalidarInscricao($acao, $inscricoes) 
    {
        try {
            $tbl = new Admin_Model_DbTable_Remanejamento_Inscricoes();
            
            foreach($inscricoes as $inscricao) {
                $acao   = Zend_Filter::filterStatic($acao, 'Digits');
                $codigo = Zend_Filter::filterStatic($inscricao, 'Digits');
                
                $bind['ins_cd_mot_invalida']    = $acao;
                $where                          = "ins_codigo = {$codigo}";
                $tbl->update($bind, $where);
            }
            
            $result = array('type'      => 'success',
                            'result'    => true,
                            'flashMsg'  => 'Inscrições invalidadas com sucesso.');            
            
        } catch (Exception $exc) {
            $result = array('type'      => 'erro',
                            'result'    => false,
                            'flashMsg'  => 'Erro interno: Um ou mais inscrições não foram invalidadas.');    
        }
        
        return $result;
    }
    
    /**
     * Função que irá contar o número de inscrições de acordo com a DRE escolhida ou uma contagem de inscrições gerais.
     * -- O retorno será array(total inscricoes, total inscricoes válidas)
     * -- @todo fazer uma query somente para buscar as válidas e as inválidas.
     * 
     * @param int $dre
     * @return array 
     */
    public function contarInscricoes($dre) 
    {
        $tbl    = new Admin_Model_DbTable_Remanejamento_Inscricoes();
        $slc1   = $tbl->select();
        $slc2   = $tbl->select();
        
        // Total de inscrições, validas ou não
        $slc1->from(array('ins' => 'inscricoes'), array('count(ins_codigo) as total', 'ins_reg_escolha'), 'remanejamento')
            ->joinLeft(array('ua' => 'unidades_administrativas'), 'ins.ins_reg_escolha = ua.tua_dr and ins.ins_reg_escolha_sub = ua.tua_subcodigo', array('ua.tua_descricao'), 'sigrh')
            ->setIntegrityCheck(false)
            ->group('ins_reg_escolha')
            ->group('tua_descricao');
        if (!empty($dre)) {
            $slc1->where('ins.ins_reg_escolha = ?', $dre);
        }
        $totalInscricoes = $tbl->fetchAll($slc1);       
        
        // Inscrições válidas, se ins_st_inscricao == 1
        $slc2->from(array('ins' => 'inscricoes'), array('count(ins_codigo) as total', 'ins_reg_escolha'), 'remanejamento')
            ->group('ins.ins_reg_escolha')
            ->where('ins.ins_st_inscricao = ?', 1);
        $totalInscValida = $tbl->fetchAll($slc2);
        if (!empty($dre)) {
            $slc2->where('ins.ins_reg_escolha = ?', $dre);
        }
        
        // Criando arrays para facilitar a view
        if (count($totalInscricoes) >= 1) 
            $totalInscricoes = $totalInscricoes->toArray();        
        if (count($totalInscValida) >= 1) {
            foreach ($totalInscValida as $arrInscValida) {
                $inscValida[$arrInscValida->ins_reg_escolha] = $arrInscValida->total;
            }
        }
        
        return array('totalInscricoes' => $totalInscricoes,
                     'totalInscValida' => $inscValida);
    }
    
    
    /**
     * Função que irá retornar o número de inscrições realizadas por dia, separando-as por categorias
     *     -- Data	
     *     -- Interno	
     *     -- Externo	
     *     -- Interno/Externo	
     *     -- Total Data
     * 
     * @todo fazer a função consultar no banco, esta apenas como um mocape
     * @return array
     */
    public function listarInscricoesPorDia() 
    {
        return array();
    }
    
    
    /**
     * Esta função foi criada pois não existe no banco de dados domínio sobre estas informações.
     * -- Recomenda-se a criação do domínio na base de dados.
     * @todo migrar este conteúdo para uma tabela
     * 
     * @return array $motivo
     */
    public function motivosInvalidacao() 
    {
        $motivo = array("1" => "Professor(a) Sem Lotação Definitiva na DRE.",
                        "2" => "Professor(a) Cedido",
                        "3" => "O(a) Professor(a) Não Apresentou a Declaração de Aptidão / Atuação.",
                        "4" => "Professor(a) Com Restrição Funcional / Limitação de Atividades",
                        "5" => "Professor(a) Afastado(a) pelo Art. 120 / LAC / LAP / Afast. Rem. para Estudos, etc.",
                        "6" => "O(a) Professor(a) Já Possui Lotação na DRE",
                        "7" => "Excluido por Recurso",
                        "8" => "Nesta DRE não há IEs com caracterização de zona rural");
        
        return $motivo;
    }
}